package com.proyecto.personas.modelo.servicio;

import java.util.List;
import org.hibernate.Session;

import com.proyecto.core.modelo.DAOGenerico;
import com.proyecto.core.modelo.echo.constantes.TipoBusqueda;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.personas.modelo.dto.PersRelaciones;
import com.proyecto.personas.modelo.dto.PersRelacsTipo;
import com.proyecto.personas.modelo.dto.PersRelacsTipoId;
import com.proyecto.personas.modelo.dto.Personas;
import com.proyecto.personas.modelo.dto.PersonasId;

public class ServicioPersRelaciones extends ServicioGenerico  {
	
	private DAOGenerico DAOPersona;
	
	private DAOGenerico DAOTipoRel;
	ServicioPersonas servicioPersonas;
	
	@Override
	public void incluir(Object o, boolean iniciaTransaccion) throws GeneralException {	
		PersRelaciones pnormal = (PersRelaciones)o;
		super.incluir(pnormal,true); 
		PersRelaciones pInversa = relacionInversa(pnormal);
		super.incluir(pInversa,true);
	}
	
	@Override
	public void eliminar(Object o, boolean iniciaTransaccion) throws GeneralException {
		PersRelaciones pnormal = (PersRelaciones)o;
		PersRelaciones pInversa = relacionInversaEliminar(pnormal);
		super.eliminar(pnormal,iniciaTransaccion); 
		super.eliminar(pInversa, iniciaTransaccion);
	}

	@Override
	public void modificar(Object o, boolean iniciaTransaccion) throws GeneralException {
		PersRelaciones pnormal = (PersRelaciones)o;
		super.modificar(pnormal,iniciaTransaccion); 
		
		PersRelaciones pInversa = modificaInversa(pnormal);
		if(pInversa!=null){
		super.modificar(pInversa,iniciaTransaccion);
		}
	}
	
	/**
	 * Devuelve la relacion entre dos personas en caso de existir..
	 * Si no hay realcion entre las dos personas cuyos numero de personas se introducen por parametros
	 * entonces el metodo retornara una excepcion..
	 * @param ciaopr
	 * @param persona1
	 * @param persona2
	 * @param sesion
	 * @return
	 * @throws GeneralException
	 * @author Carlos Yepez.
	 */
	public List<String>  relacionEntre(String ciaopr,Integer persona1, Integer persona2, Session sesion) throws GeneralException{
		String queryString = "select persrelstipcod from pers_relaciones " +
				"where ciaopr ='"+ciaopr+"' " +
				"and (nropersona = "+persona1.toString()+" and nropersonarel = "+persona2.toString()+") " +
				"or (nropersona = "+persona2.toString()+" and nropersonarel = "+persona1.toString()+") ";
		List result = null;
		try {
			result = propiedadDAO.ejecutarConsultaSQL(queryString, sesion);
			if (result == null || result.size() < 1 || result.get(0)==null){
				throw new GeneralException("advertencia.persona.persRelaciones.relacionEntreDosPersonasInexistentes");
			}else{
				return result;
			}
		} catch (Exception e) {
			if (e instanceof GeneralException) {
				throw ((GeneralException)e);
			}
		}
		return null;
	}

	/*Devuelve un pojo con el tipo de relaci�n entre dos personas*/
	private String tipoRelacionPersona(String ciaOpr, String tiporelacionCod){
		PersRelacsTipo tipoRelacionPersona =  (PersRelacsTipo) DAOTipoRel.findById(new PersRelacsTipoId(ciaOpr,tiporelacionCod));
		
		return tipoRelacionPersona.getPersrelstipcodinv();
	}
	
	/*Devuelve un pojo con la relaci�n inversa para ser incluida*/
	private PersRelaciones relacionInversa(PersRelaciones pnormal){
		PersRelaciones personaRelacionInversa = new PersRelaciones();
		//los que no son ID
		personaRelacionInversa.setEstatusrelacion(pnormal.getEstatusrelacion());
		personaRelacionInversa.setFechafinrelacion(pnormal.getFechafinrelacion());
		personaRelacionInversa.setFechainicrelacion(pnormal.getFechainicrelacion());
		//llenamos el id
		personaRelacionInversa.getId().setNropersonarel(pnormal.getId().getPersonas().getId().getNropersona());
		String relInversa = tipoRelacionPersona(pnormal.getId().getPersonas().getId().getCiaopr(),pnormal.getId().getPersrelstipcod());
		personaRelacionInversa.getId().setPersrelstipcod(relInversa);
		
		Personas personas = new Personas();
		personas.getId().setCiaopr(pnormal.getId().getPersonas().getId().getCiaopr());
		personas.getId().setNropersona(pnormal.getId().getNropersonarel());
		
		Personas personas1 = consultarPersonaRelacionada(personas.getId());
		
		personaRelacionInversa.getId().setPersonas(personas1);
		personaRelacionInversa.setPersonasrel(pnormal.getId().getPersonas());
		return personaRelacionInversa;
	}
	
	private PersRelaciones modificaInversa(PersRelaciones pnormal){
		PersRelaciones personaRelacionInversa = new PersRelaciones();
		try {
			personaRelacionInversa = (PersRelaciones) this.buscarCatalogoPorPropiedad(
					new String[] { "id.personas.id.ciaopr", "id.nropersonarel","id.personas.id.nropersona",
							 }, new Object[] { "1",
							pnormal.getId().getPersonas().getId().getNropersona(),pnormal.getId().getNropersonarel(),
							 },
					TipoBusqueda.OPE_IGUAL).get(0);
			//los que no son ID
		} catch (Exception e) {
			// TODO: handle exception
		}		
		personaRelacionInversa.setEstatusrelacion(pnormal.getEstatusrelacion());
		personaRelacionInversa.setFechafinrelacion(pnormal.getFechafinrelacion());
		personaRelacionInversa.setFechainicrelacion(pnormal.getFechainicrelacion());
		return personaRelacionInversa;
	}
	
	
	private PersRelaciones relacionInversaEliminar(PersRelaciones pnormal) throws GeneralException{
		
		
		PersRelaciones personaRelacionInversa = new PersRelaciones();
		//los que no son ID
		personaRelacionInversa.setEstatusrelacion(pnormal.getEstatusrelacion());
		personaRelacionInversa.setFechafinrelacion(pnormal.getFechafinrelacion());
		personaRelacionInversa.setFechainicrelacion(pnormal.getFechainicrelacion());
		//llenamos el id
		personaRelacionInversa.getId().setNropersonarel(pnormal.getId().getPersonas().getId().getNropersona());
		String relInversa = tipoRelacionPersona(pnormal.getId().getPersonas().getId().getCiaopr(),pnormal.getId().getPersrelstipcod());
		personaRelacionInversa.getId().setPersrelstipcod(relInversa);
		
		Personas personas = new Personas();
		personas.getId().setCiaopr(pnormal.getId().getPersonas().getId().getCiaopr());
		personas.getId().setNropersona(pnormal.getId().getNropersonarel());
		
		Personas personas1 = consultarPersonaRelacionada(personas.getId());
		
		personaRelacionInversa.getId().setPersonas(personas1);
		personaRelacionInversa.setPersonasrel(pnormal.getId().getPersonas());
		
		PersRelaciones pri = (PersRelaciones)super.consultar(personaRelacionInversa.getId());
		return pri;
	}
	
	/*Retorna un pojo de persona, la cual es la que est� relacionada con la persona del expediente*/
	private Personas consultarPersonaRelacionada (PersonasId p){
		return (Personas) DAOPersona.findById(p);
	}

	public Personas obtenerPersonaRelacionada(PersonasId p){
		Personas objPersona = null;
		
		return objPersona;
	}
	
	/**
	 * buecar la persona relacionada para el mejor de los casos un Recien Nacido
	 * @param ciaopr
	 * @param nropersona
	 * @return
	 * @throws GeneralException
	 */
	public Personas buscarRelacionPersona(String ciaopr, Integer nropersona) throws GeneralException{
		Personas objPersonas = null;
		
		//buscamos la persona que posee la relacion con otra y para ello usaremos el atributo nropersonarel
		Integer nropersonarel = buscarNroPersonaRelacion(ciaopr, nropersona);
		//una vez ubicamos por lo menos 1 coincidencia de relacion la consultamos en personas.
		objPersonas = servicioPersonas.obtenerPersona(ciaopr, nropersonarel);
		
		return objPersonas;
	}

	private Integer buscarNroPersonaRelacion(String ciaOpr, Integer nropersonarel)  throws GeneralException{
		List<PersRelaciones> objPersRelaciones = null;
		
		Integer nroPersona = -1;
		
		try{
		    if (nropersonarel != null && !"".equals(nropersonarel)
		    	){
		        String[] atributo = {"id.personas.id.ciaopr","id.nropersonarel"};
		        Object[] valor = {ciaOpr, nropersonarel};
		        objPersRelaciones = this.buscarCatalogoPorPropiedad(atributo, valor, TipoBusqueda.OPE_IGUAL);
		        nroPersona = objPersRelaciones.get(0).getId().getPersonas().getId(). getNropersona();
	        }
		}catch (GeneralException e) {

		}
		return nroPersona;
	}
	public DAOGenerico getDAOPersona() {
		return DAOPersona;
	}

	public void setDAOPersona(DAOGenerico persona) {
		DAOPersona = persona;
	}

	public DAOGenerico getDAOTipoRel() {
		return DAOTipoRel;
	}

	public void setDAOTipoRel(DAOGenerico tipoRel) {
		DAOTipoRel = tipoRel;
	}

	public ServicioPersonas getServicioPersonas() {
		return servicioPersonas;
	}

	public void setServicioPersonas(ServicioPersonas servicioPersonas) {
		this.servicioPersonas = servicioPersonas;
	}
	
}